'''
1、迭代器
概念上: 迭代器可以用来表示一个数据流, 提供了数据的惰性返回功能(只有我们主动去使用next方法调用, 才会返回值).
实现上: 实现了`__next__`接口的对象

生成器是一种特殊的迭代器, 在迭代器惰性返回数据的基础上, 提供了额外的功能, 实现了程序的暂停.
区别：同样提供了惰性返回的功能, 迭代器侧重于提供**数据**的惰性返回功能, 生成器侧重于**指令**的惰性返回功能

2、协程的实现原理就是生成器的实现原理, 在生成器的基础上又提供了传递值的功能.
3、asyncio实现原理: 自动维护了一个事件队列, 然后循环访问事件来完成异步的消息维护.
'''

# 4、用协程实现一个计算平均数的函数


def coro_avg():
    total = 0
    lenght = 0
    while True:
        try:
            value = yield total/lenght
        except ZeroDivisionError:
            value = yield 0
        print(f"got send value {value}")
        total += value
        lenght += 1


my_avg = coro_avg()
print(my_avg)
next(my_avg)
print(my_avg.send(8))
print(my_avg.send(9))
print(my_avg.send(10))

# 5、 编写asyncio异步程序
import asyncio
import time


async def ptime():
    t = time.time()
    await asyncio.sleep(1)
    print("the time:", t)


# 获取名单/消息队列
loop = asyncio.get_event_loop()
# 包装任务
tasks_array = []
for i in range(100):
    tasks_array.append(ptime())
loop.run_until_complete(asyncio.wait(tasks_array))
loop.close()

